package models

import (
	"bigdevops/src/common"
	"fmt"
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
)

// 发送任务 和机器的关系
// 1对多 机器只能属于1个发送任务
// 新建发送任务 就需要填入ip
// 主配置文件池
// job 对象 机器：ip+port
//
//	值班创建日期 第一个人 就是数组里的人
type MonitorOndutyGroup struct {
	Model        // 不用每次写ID 和 createAt了
	Name  string `json:"name" validate:"required,min=1,max=50" gorm:"uniqueIndex;type:varchar(100);comment:分组英文名称 给AlertManager配置文件使用，支持使用通配符*进行模糊搜索" `
	// D:\nyy_work\go_path\src\github.com\prometheus\alertmanager\config\config.go
	UserID uint
	// 公共的

	// 发送的逻辑
	Members []*User `json:"members" gorm:"many2many:monitor_onduty_users;comment:静态配置的接收人列表"` // 多对多

	ShiftDays                int    `json:"shiftDays" gorm:"comment:轮班周期 1天 3天 1周=7天"`
	ImRobotToken             string `json:"imRobotToken" gorm:"comment:im机器人token 对应的是哪个im群"`
	YestodayNormalDutyUserId uint   `json:"yestodayNormalDutyUserId"  gorm:"comment:不考虑换班的 正常排班的昨天值班人 这个值只能由cron去设置"`

	// 当天值班人
	TodayDutyUser  *User    `json:"todayDutyUser" gorm:"-"`
	UserNames      []string `json:"userNames" gorm:"-"`
	Key            string   `json:"key" gorm:"-"` //给前端表格
	CreateUserName string   `json:"createUserName" gorm:"-"`
}

func (obj *MonitorOndutyGroup) Create() error {
	return Db.Create(obj).Error

}
func (obj *MonitorOndutyGroup) DeleteOne() error {

	return Db.Select(clause.Associations).Unscoped().Delete(obj).Error

}

func (obj *MonitorOndutyGroup) UpdateMembers() error {

	return Db.Model(obj).Association("Members").Replace(obj.Members)
}

func (obj *MonitorOndutyGroup) CreateOne() error {
	return Db.Create(obj).Error

}

func (obj *MonitorOndutyGroup) FillTodayOnDutyUser() {
	// 和cache的逻辑一致

	todayString := common.GetDayAgoDate(0)
	dbHistoryToday, _ := GetMonitorOndutyHistoryByOndutyGroupIdAndDay(obj.ID, todayString)

	if dbHistoryToday.OnDutyUserId > 0 {
		user, _ := GetUserById(int(dbHistoryToday.OnDutyUserId))
		if user.ID > 0 {
			obj.TodayDutyUser = user
		}
	} else {
		obj.TodayDutyUser = obj.Members[0]
	}
}

func (obj *MonitorOndutyGroup) UpdateOne() error {
	return Db.Debug().Where("id = ?", obj.ID).Updates(obj).Error

}

func (obj *MonitorOndutyGroup) FillFrontAllData() {
	dbUser, _ := GetUserById(int(obj.UserID))
	if dbUser != nil {
		obj.CreateUserName = dbUser.Username
	}

	obj.UserNames = commonGetUserNamesByUsers(obj.Members)

	//
	//dbAlertI, _ := GetMonitorAlertmanagerInstanceById(int(obj.AlertManagerInstanceId))
	//if dbAlertI != nil {
	//	obj.PoolName = dbPoll.Name
	//}

	obj.Key = fmt.Sprintf("%d", obj.ID)

}
func GetMonitorOndutyGroupAll() (objs []*MonitorOndutyGroup, err error) {
	err = Db.Preload("Members").Find(&objs).Error
	return
}

func GetMonitorOndutyGroupCount() int {
	var count int64
	Db.Table("form_designs").Count(&count)
	return int(count)
}

func GetMonitorOndutyGroupByLevel(level int) (objs []*MonitorOndutyGroup, err error) {
	err = Db.Where("level = ?", level).Preload("OpsAdmins").Find(&objs).Error
	return
}

// select * from ecs where
func GetMonitorOndutyGroupByIdsWithLimitOffset(ids []int, limit, offset int) (objs []*MonitorOndutyGroup, err error) {
	err = Db.Limit(limit).Offset(offset).Preload("Members").Find(&objs, ids).Error
	return
}

// 查询这个节点池管理的发送Job
func GetMonitorOndutyGroupByPoolId(poolId uint) (objs []*MonitorOndutyGroup, err error) {

	//err = Db.Where("enable=1 and pool_id = ?", poolId).Find(&objs).Error
	err = Db.Where(" pool_id = ?", poolId).Find(&objs).Error
	return

}

func GetMonitorOndutyGroupById(id int) (*MonitorOndutyGroup, error) {

	var dbObj MonitorOndutyGroup
	err := Db.Where("id = ?", id).Preload("Members").First(&dbObj).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return nil, fmt.Errorf("MonitorOndutyGroup不存在")
		}
		return nil, fmt.Errorf("数据库错误:%w", err)
	}
	return &dbObj, nil

}
